package com.zds.zds_picture_backend.exception;/*
 *@auther 郑笃实
 *@version 1.0
 *
 */

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import com.zds.zds_picture_backend.common.BaseResponse;
import com.zds.zds_picture_backend.common.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
//这是 Spring 提供的一个 全局异常处理 和 全局数据绑定 的注解。
//
//它的本质是：@ControllerAdvice + @ResponseBody 的组合。
//
//用在 REST 风格的项目（比如前后端分离 API 接口），能让异常处理方法直接返回 JSON，而不是跳转到一个错误页面。
@Slf4j//日志 lombok的
public class GlobalExceptionHandler {

    @ExceptionHandler(NotLoginException.class)
    public BaseResponse<?> notLoginException(NotLoginException e) {
        log.error("NotLoginException", e);
        return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, e.getMessage());
    }

    @ExceptionHandler(NotPermissionException.class)
    public BaseResponse<?> notPermissionExceptionHandler(NotPermissionException e) {
        log.error("NotPermissionException", e);
        return ResultUtils.error(ErrorCode.NO_AUTH_ERROR, e.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    //告诉 Spring：当某个 Controller 里抛出了 RuntimeException（运行时异常），就由这个方法来统一处理。
    public BaseResponse<?> businessExceptionHandler(BusinessException e) {
        log.error("业务异常: ", e);
        // 如果你的 BaseResponse 已添加 description 字段，第三个参数可放详细描述；没有就传 null/删掉
        return ResultUtils.error(e.getCode(), e.getMessage(), null);
    }

    @ExceptionHandler(RuntimeException.class)
    public BaseResponse<?> handleRuntimeException(RuntimeException e) {
        log.error("RuntimeException", e);
        return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误", e.getMessage());
    }
}
